home *** CD-ROM | disk | FTP | other *** search
/ Eagles Nest BBS 8 / Eagles_Nest_Mac_Collection_Disc_8.TOAST / Developer Tools⁄Additions / PSErrorHandl / PEH / DEBUG.PS < prev    next >
Text File  |  1989-10-11  |  24KB  |  1,007 lines

  1. %!
  2. %% Advanced PostScript Error Handler
  3. %% Copyright (C) 1989 by Systems of Merritt, Inc.
  4. %% All Rights Reserved
  5. %% Created by Frank Merritt Braswell
  6. %% 
  7. %% Systems of Merritt, Inc.
  8. %% 2551 Old Dobbin Drive East
  9. %% Mobile, AL  36695
  10. %% (205) 660-1240
  11.  
  12. %% Revision dates 8/10/89-9/27/89
  13.  
  14. % Purpose -  To print diagnostic information during error conditions
  15.  
  16. % Usage - Send program to a PostScript printer via any available
  17. %         communication channel on Mac or PC.
  18. %         Diagnostic messages may be viewed by watching the
  19. %         reverse channel.
  20.  
  21. % Documentation - Accompanying hardcopy documentation describes 
  22. %         program usage and interpretation of the PostScript execution
  23. %         stack for advanced debugging.
  24.  
  25. % Output - Error information can be viewed on the reverse channel.
  26. %         Hardcopy output can also be requested.
  27.  
  28. % This program was designed to run on Adobe PostScript printers and
  29. % may not run on clone printers.  If you have any questions or
  30. % problems, please call Systems of Merritt, Inc.
  31. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  32. %                         OPTION SETTINGS
  33.  
  34. % Below are 4 boolean variables which control program options. To 
  35. % select or disable an option, the user must change the true or false
  36. % settings accordingly. Any ascii text editor can be used to modify and
  37. % save the file.
  38. %
  39. % The variables may be changed independent of each other.
  40. %
  41. % DESCRIPTIONS
  42. %
  43. % /_fmb_printout
  44. %         This variable determines if error information is printed when
  45. %         an error occurs. The first page printed represents any marks
  46. %         the user has placed on the page prior to the error. The error
  47. %         handler simply issues a "showpage" and does not write on the user's
  48. %         page. Following are one or more pages (usually one page) 
  49. %         with error information.
  50. %
  51. % /_fmb_printout VALUES
  52. %         true : showpage issues and error information printed
  53. %         false: nothing printed
  54. %
  55. % /_fmb_switchan
  56. %         When the user is operating in serial batch mode on either the
  57. %         9 pin or 25 pin channel the error handler switches to the alternate
  58. %         I/O channel to enter the executive mode. This has no effect if the
  59. %         communications mode is AppleTalk or the alternate channel is
  60. %         turned off.
  61. %
  62. % /_fmb_switchan VALUES
  63. %         true : switch channels when error occurs
  64. %         false: do not switch channels
  65. %
  66. % /_fmb_printallstack
  67. %         This options allows an abbreviated copy of the execution
  68. %         stack to be printed. The execution stack contains several
  69. %         Adobe system procedures which do not concern most users.
  70. %         The user's program appears at the top ot the execution stack and
  71. %         is printed in either case.
  72. %
  73. % /_fmb_printallstack VALUES
  74. %         true : print entire execution stack including Adobe procs
  75. %         false: print abbreviated execution stack
  76. %
  77. % /_fmb_gotoexecutive
  78. %         This determines whether the executive or interactive
  79. %         mode is entered after an error. Once in the executive mode, 
  80. %         the user can request a hardcopy printout of the error information 
  81. %         or examine variables used by the aborted program.
  82. %
  83. % /_fmb_gotoexecutive VALUES
  84. %         true : enter executive mode upon error
  85. %         false: do not enter executive
  86. %                     
  87. % RESTRICTIONS
  88. %
  89. % In general, when running AppleTalk, it is not possible to use the _fmb_gotoexecutive
  90. % option without possibly affecting the entire network. Unless you know what you
  91. % are doing, "_fmb_gotoexecutive" should be set to false when using AppleTalk.
  92. %
  93. % LOOK BELOW FOR OPTION VARIABLES CODE BLOCK
  94. % The option variables had to be placed after the exitserver code. They
  95. % are clearly marked about 30 lines down from here.
  96. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  97. 0000      % THIS IS YOUR PASSWORD!!! 
  98.           % MAKE SURE IT IS CORRECT OR PROGRAM WILL
  99.           % NOT LOAD
  100. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  101. dup statusdict begin checkpassword end
  102. {
  103.   serverdict begin exitserver
  104. }
  105. {
  106.   =print ( ) =print (: This is not your system password!) =
  107.   (Advanced PostScript Error Handler cannot be downloaded.) =
  108.   (Please supply Advanced PostScript Error Handler \
  109. program with correct password.) = flush
  110.   /Courier findfont 10 scalefont setfont
  111.   30 215 moveto
  112.   (***** SYSTEMS OF MERRITT, INC. ADVANCED POSTSCRIPT ERROR HANDLER *****) 
  113.   show
  114.   30 200 moveto 
  115.   (Incorrect Password - Advanced PostScript Error Handler not loaded.) show
  116.   30 185 moveto
  117.   (Make sure password in Advanced PostScript Error Handler \
  118. matches your printer password.) show
  119.   systemdict /showpage get exec
  120.   stop
  121. } ifelse
  122.  
  123. vmstatus
  124. pop /_fmb_vm exch def pop
  125. /_fmb_=string 128 string def
  126. { % catch option errors
  127. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  128. %                   OPTION VARIABLES
  129. %
  130. /_fmb_printout             % paper output?
  131.     true         def       % default value: true
  132. /_fmb_switchan             % switch channels?
  133.     false        def       % default value: false
  134. /_fmb_printallstack        % print all execution stack?
  135.     false        def       % default value: false
  136. /_fmb_gotoexecutive        % enter executive mode after error?
  137.     false        def       % default value: false
  138. %
  139. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  140. %                   OVERRIDE VARIABLE
  141. %
  142. % If another error handler is taking over (usually from an
  143. % application program) set this variable to true.
  144. % When set to true, no other error handler can take precidence
  145. % over the Advanced PostScript Error Handler.
  146. %
  147. /_fmb_override             % override another error handler
  148.     false        def       % default value: false
  149. %
  150. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  151. } stopped
  152. {
  153.   (Option error!!!!!!!!!!!!!) = flush
  154.   /Courier findfont 10 scalefont setfont
  155.   30 215 moveto
  156.   (***** SYSTEMS OF MERRITT, INC. ADVANCED POSTSCRIPT ERROR HANDLER *****) 
  157.   show
  158.   30 200 moveto 
  159.   (Option Error - Advanced PostScript Error Handler not loaded.) show
  160.   30 185 moveto 
  161.   (Check Advanced PostScript Error Handler option variables \
  162. for correct syntax.) show 
  163.   30 170 moveto
  164.   (%%[ Error: ) show
  165.   $error /errorname get _fmb_=string cvs show
  166.   (; OffendingCommand: ) show
  167.   $error /command get _fmb_=string cvs show
  168.   ( ]%%) show
  169.   systemdict /showpage  get exec
  170.   stop 
  171. } if
  172.  
  173. userdict
  174.  
  175. /_fmb_handleerror
  176. {
  177.   $error begin
  178.   newerror
  179.  {
  180.     /newerror false def
  181.     vmstatus
  182.     _fmb_d begin
  183.     /vmtotal exch def
  184.     /vmused exch def
  185.     /savelev exch def
  186.     end % _fmb_d
  187.     (%%[ Error: ) print
  188.     errorname
  189.     {
  190.       dup type
  191.       /stringtype
  192.       ne
  193.       {
  194.         _fmb_=string cvs
  195.       } if
  196.       print
  197.     }
  198.     exec
  199.     (; OffendingCommand: ) print
  200.     /command load
  201.     {
  202.       dup type
  203.       /stringtype
  204.       ne
  205.       {
  206.         _fmb_=string cvs
  207.       } if
  208.       print
  209.     }
  210.     exec
  211.     ( ]%%)
  212.     {
  213.       {
  214.         dup type
  215.         /stringtype
  216.         ne
  217.         {
  218.           _fmb_=string cvs
  219.         } if
  220.         print
  221.       }
  222.       exec
  223.       (\n) print
  224.     }
  225.     exec
  226.     flush
  227.  
  228.   errorname /VMerror ne
  229.  {
  230.   _fmb_d /my_usertime usertime put
  231.   _fmb_d /_fmb_jl1 ( ) put
  232.   _fmb_d /_fmb_jl2 ( ) put
  233.   execdict /execdepth get 0 eq
  234.   {       % if not in executive enter it
  235.      _fmb_d begin
  236.      _fmb_==dict begin
  237.     serverdict begin
  238.  
  239.     stdin status
  240.     errorname /timeout eq
  241.     stdin bytesavailable 0 eq
  242.     and not
  243.     and
  244.     { % need to dump input
  245.       stdin _fmb_junkline1 readstring
  246.       { % EOF not encountered
  247.         { % dump remainder
  248.           stdin _fmb_junkline2 readstring
  249.           { % not EOF
  250.             pop
  251.           }
  252.           { % EOF
  253.             pop exit
  254.           } ifelse
  255.         } loop
  256.         (\n) search
  257.         { % \n found
  258.           /_fmb_jl1 exch store
  259.           pop
  260.           (\n) search
  261.           { % \n found
  262.             /_fmb_jl2 exch store
  263.             pop pop
  264.           }
  265.           { % \n not found
  266.             /_fmb_jl2 exch store
  267.           } ifelse
  268.         }
  269.         { % \n not found
  270.           dup length rmargin
  271.           le
  272.           { % string le rmargin
  273.            /_fmb_jl1 exch store
  274.            /_fmb_jl2 ( ) store
  275.           }
  276.           { % string gt rmargin
  277.             /_fmb_jltemp exch store
  278.             _fmb_jltemp 0 rmargin 1 sub get
  279.             /_fmb_jl1 exch store
  280.             _fmb_jltemp rmargin _fmb_jltemp length rmargin sub get
  281.             /fmb_jl2 exch store
  282.           } ifelse
  283.         } ifelse
  284.       }
  285.       { % EOF found
  286.         (\n) search
  287.         { % \n found
  288.           /_fmb_jl1 exch store
  289.           pop
  290.           (\n) search
  291.           { % \n found
  292.             /_fmb_jl2 exch store
  293.             pop pop
  294.           }
  295.           { % \n not found
  296.             dup length 0 gt
  297.             { % string for jl2
  298.               /_fmb_jl2 exch store
  299.             }
  300.             { % null string
  301.               pop
  302.               /_fmb_jl2 _fmb_EOF store
  303.             } ifelse
  304.           } ifelse
  305.         }
  306.         { % \n not found
  307.           dup length rmargin
  308.           le
  309.           { % string le rmargin
  310.            dup length 0 eq
  311.            {
  312.              /_fmb_jl1 _fmb_EOF store
  313.              /_fmb_jl2 ( ) store
  314.            }
  315.            {
  316.              /_fmb_jl1 exch store
  317.              /_fmb_jl2 _fmb_EOF store
  318.            } ifelse
  319.           }
  320.           { % string gt rmargin
  321.             /_fmb_jltemp exch store
  322.             _fmb_jltemp 0 rmargin 1 sub get
  323.             /_fmb_jl1 exch store
  324.             _fmb_jltemp rmargin _fmb_jltemp length rmargin sub get
  325.             /fmb_jl2 exch store
  326.           } ifelse
  327.         } ifelse
  328.       } ifelse
  329.     }
  330.     { % already at EOF
  331.       /_fmb_jl1 _fmb_EOF store
  332.       /_fmb_jl2 ( ) store
  333.     } ifelse
  334.     end % serverdict
  335.     end % _fmb_==dict
  336.     (%%[ EOF Encountered ]%%) = flush
  337.  
  338.     end  % _fmb_d
  339.  
  340.     statusdict /waittimeout 5 put
  341.  
  342.  _fmb_printout
  343.    {  % print error information on paper
  344.       _fmb_err_printout
  345.    } if
  346.  
  347.   _fmb_err
  348.  
  349.  _fmb_gotoexecutive
  350.    {  % enter executive mode
  351.  
  352.       % first check to see if channel switching enabled
  353.     serverdict /altname known
  354.     statusdict /setstdio known and
  355.     { % protect _fmb_switchan from nonexistant alt channel
  356.     _fmb_switchan 
  357.     serverdict /altname get null ne
  358.     and
  359.       {  % switch to altio if _fmb_switchan true
  360.         serverdict begin
  361.         statusdict begin
  362.         altin altout setstdio
  363.         end % statusdict
  364.         end % serverdict
  365.       } if
  366.     } if
  367.  
  368.     statusdict /jobname (Advanced PostScript Error Handler) put
  369.     userdict /prompt 
  370.     {
  371.       (Advanced PostScript Error Handler) print execdepth 
  372.       {
  373.         (>) print 
  374.       } repeat flush 
  375.     }
  376.     put
  377.     cleardictstack clear
  378.     executive
  379.    } if
  380.   } if
  381.  }
  382.  { % if VMerror
  383.    statusdict /setblink known
  384.    {
  385.      statusdict begin
  386.      usertime 7000 add
  387.      {
  388.        5 setblink
  389.        dup usertime sub
  390.        0 lt
  391.        { exit
  392.        } if
  393.      } loop
  394.      end   % statusdict
  395.    } if
  396.  } ifelse
  397. } if % newerror
  398. end% $error
  399. } bind put % place _fmb_handleerror in userdict
  400. errordict /handleerror userdict /_fmb_handleerror get put
  401.  
  402. % stack builder
  403.  
  404. /_fmb_stacks
  405. {
  406. $error /ostack get null ne
  407.  {
  408.   cleardictstack
  409.   clear
  410.   2 1 $error /dstack get
  411.   length 1 sub
  412.   {
  413.     $error /dstack get
  414.     exch get begin
  415.   } for
  416.   $error /ostack get
  417.   {} forall
  418.  } if
  419. } def
  420.  
  421. systemdict /.error known
  422. {
  423. userdict begin
  424. /_fmb_.error { _fmb_override
  425.                {
  426.                errordict /handleerror userdict /_fmb_handleerror get put
  427.                userdict /handleerror {errordict /handleerror get exec} put
  428.                } if
  429.                /.error exec
  430.              }
  431.               dup dup length 2 sub systemdict /.error get put
  432.               bind def
  433. end % userdict
  434. errordict begin
  435. /typecheck 
  436.     {/typecheck /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  437. /invalidaccess 
  438.     {/invalidaccess /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  439. /nocurrentpoint 
  440.     {/nocurrentpoint /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  441. /unregistered 
  442.     {/unregistered /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  443. /invalidfileaccess 
  444.     {/invalidfileaccess /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  445. /invalidfont 
  446.     {/invalidfont /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  447. /ioerror 
  448.     {/ioerror /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  449. /stackoverflow 
  450.     {/stackoverflow /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  451. /timeout 
  452.     {/timeout /timeout /_fmb_.error exec} dup 2 userdict /_fmb_.error get put def
  453. /rangecheck 
  454.     {/rangecheck /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  455. /undefinedresult 
  456.     {/undefinedresult /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  457. /stackunderflow 
  458.     {/stackunderflow /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  459. /syntaxerror 
  460.     {/syntaxerror /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  461. /undefinedfilename 
  462.     {/undefinedfilename /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  463. /undefined
  464.     {/undefined /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  465. /limitcheck 
  466.     {/limitcheck /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  467. /unmatchedmark 
  468.     {/unmatchedmark /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  469. /execstackoverflow 
  470.     {/execstackoverflow /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  471. /VMerror 
  472.     {/VMerror /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  473. /invalidexit 
  474.     {/invalidexit /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  475. /dictstackoverflow 
  476.     {/dictstackoverflow /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  477. /invalidrestore 
  478.     {/invalidrestore /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  479. /dictfull 
  480.     {/dictfull /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  481. /dictstackunderflow 
  482.     {/dictstackunderflow /_fmb_.error exec} dup 1 userdict /_fmb_.error get put def
  483. end % errordict
  484. } if
  485.  
  486. % dict getter
  487.  
  488. /_fmb_d 60 dict def
  489. _fmb_d begin
  490.     % define entries as
  491.     % dictionary string-name
  492.     % where the dictionary is the key and string-name is value
  493.  
  494. /_fmb_version 1.0008 def
  495.  
  496. /systemdict load (-systemdict- ) def
  497. /userdict load (-userdict- ) def
  498. /$error load (-$error- ) def
  499. /statusdict load (-statusdict- ) def
  500. /errordict load (-errordict- ) def
  501. /FontDirectory load (-FontDirectory- ) def
  502. /serverdict load (-serverdict- ) def
  503.  
  504. % define some strings
  505. /_fmb_junkline1 60 string def
  506. /_fmb_junkline2 60 string def
  507. /_fmb_jl1 _fmb_junkline1 def
  508. /_fmb_jl2 _fmb_junkline2 def
  509. /_fmb_jltemp _fmb_junkline2 def
  510. /_fmb_EOF (---End of File---) def
  511.  
  512. end % _fmb_d 
  513.  
  514.           % _fmb_==dict is used to show procedures 
  515.           % on the page just like ==dict is used 
  516.           % to display objects on the reverse 
  517.           % channel
  518. /_fmb_==dict 50 dict def
  519. _fmb_==dict begin                   % open _fmb_==dict
  520.  
  521. /my==                            % my== is similar to == except that
  522.                                  % it accesses the my== dictionary
  523. {
  524.   _fmb_==dict begin
  525.   /cp 0 def typeprint nl
  526.   end     % _fmb_==dict
  527. } bind def
  528.  
  529. /pageboundries
  530. {
  531.   gsave 0 0 moveto clippath pathbbox grestore
  532.   /ury exch def /urx exch def
  533.   /lly exch def /llx exch def
  534.   /rm urx def /bm lly 12 add def
  535.   /tm ury 12 sub def /lm llx 12 add def
  536.   /line tm def
  537. } bind def
  538.  
  539. /_fmb_banner
  540. {
  541. nl
  542. (Advanced PostScript Error Handler      Version )
  543.              =print _fmb_d /_fmb_version get my==
  544. (Copyright (C) 1989 by Systems of Merritt, Inc.) =print nl
  545. statusdict begin
  546. (Product: ) =print product =print (, Version: ) =print
  547. version =print (, Revision: ) =print revision my==
  548. end % statusdict
  549.  
  550. _fmb_d begin
  551. _fmb_d /vmtotal known
  552. {
  553. (Total VM: ) =print vmtotal =print
  554. (, VM Used: ) =print vmused =print
  555. (, VM Left: ) =print vmtotal vmused sub my==
  556. (Current Save Level: ) =print savelev
  557. serverdict /stdname known
  558. {
  559.   =print
  560.   (, Interface: ) =print
  561.   serverdict /stdname get
  562. } if
  563. =
  564. } if
  565.  
  566. (Usertime: ) =print
  567. _fmb_d /my_usertime known
  568. {
  569.   _fmb_d /my_usertime get
  570. }
  571. {
  572.   usertime
  573. } ifelse
  574. my== nl
  575. end % _fmb_d
  576. } def
  577.  
  578. /courier /Courier findfont 10 scalefont def
  579. /outfs serverdict /stdout get def
  580. /print { outfs exch writestring } def
  581. /flush { outfs flushfile } def
  582. /NL (\n) def
  583. /nl_rchan {(\n) =print} def
  584. /nl_printout 
  585. {
  586.   /line line 10 sub store
  587.   line bm le 
  588.   {
  589.     systemdict /showpage get exec
  590.      /line tm def
  591.   } if
  592.   lm line moveto
  593. } def
  594.  
  595. /=print_rchan 
  596. {
  597.   dup type /stringtype ne
  598.   { _fmb_=string cvs
  599.   } if
  600.   print
  601. } def
  602.  
  603. /=_rchan 
  604. {
  605.   /=print_rchan load exec nl_rchan
  606. } def
  607.  
  608. /=print_printout
  609. {
  610.   dup type /stringtype ne
  611.   {
  612.     _fmb_=string cvs
  613.   } if
  614.   show
  615. } bind def
  616.  
  617. /=_printout
  618. {
  619.   /=print_printout load exec nl_printout
  620. } bind def
  621.  
  622. /_fmb_ostack 0 def
  623. /cp 0 def
  624. /len 0 def
  625. /rmargin 60 def                  % define variables and procedures
  626.                                  % contained in _fmb_==dict
  627. /typeprint                       % typeprint
  628. {      
  629.   dup type exec
  630. } bind def
  631.  
  632. /tprint_rchan
  633. {
  634.   dup length cp add rmargin gt
  635.   {    
  636.     NL print /cp 0 def
  637.   } if 
  638.   dup length cp add /cp exch def print
  639. } bind def
  640.  
  641. /tprint_printout                 % tprint
  642. {                                % this procedure deviates from the
  643.   dup length cp add rmargin gt   % adobe ==dict with slight changes
  644.                                  % which show information on the
  645.                                  % page instead of on the reverse
  646.                                  % channel when == is invoked
  647.   {    
  648.     nl /cp 0 def
  649.   } if 
  650.   dup length cp add /cp exch def show
  651. } bind def
  652.  
  653. /cvsprint        % cvsprint
  654. {      
  655.   _fmb_=string cvs tprint ( ) tprint
  656. } bind def       % cvsprint ends here                    
  657.  
  658. /savetype        % savetype
  659. {      
  660.   pop (-savelevel- ) tprint
  661. } bind def
  662.  
  663. /nulltype        % nulltype
  664. {      
  665.   pop (-null- ) tprint
  666. } bind def
  667.  
  668. /operatortype    % operatortype
  669. {      
  670.   (--) tprint _fmb_=string cvs tprint
  671.   (--) tprint
  672. } bind def
  673.  
  674. /stringtype      % stringtype
  675. {      
  676.   dup rcheck
  677.   {
  678.     (\() tprint tprint (\)) tprint
  679.   }    
  680.   {    
  681.     pop (-string- ) tprint
  682.   } ifelse
  683. } bind def
  684.  
  685. /arraytype       % arraytype
  686. {      
  687.   dup rcheck
  688.   {    
  689.     dup xcheck
  690.     {  
  691.       ({) tprint
  692.       {
  693.         typeprint
  694.       } forall
  695.       (}) tprint
  696.     }  
  697.     {  
  698.       ([) tprint
  699.       {
  700.         typeprint
  701.       } forall
  702.       (]) tprint
  703.     } ifelse
  704.   }    
  705.   {    
  706.     pop (-array- ) tprint
  707.   } ifelse
  708. } bind def
  709.  
  710. /fonttype        % fonttype
  711. {      
  712.   pop (-fontid- ) tprint
  713. } bind def
  714.  
  715. /packedarraytype % packedarraytype
  716. {      
  717.   dup rcheck
  718.   {    
  719.     dup xcheck
  720.     {  
  721.       ({) tprint
  722.       {
  723.         typeprint
  724.       } forall
  725.       (}) tprint
  726.     }  
  727.     {  
  728.       ([) tprint
  729.       {
  730.         typeprint
  731.       } forall
  732.       (]) tprint
  733.     } ifelse
  734.   }    
  735.   {    
  736.     pop (-packedarray- ) tprint
  737.   } ifelse
  738. } bind def
  739.  
  740. /marktype        % marktype
  741.   pop (-mark- ) tprint
  742. } bind def
  743.  
  744. /integertype     % integertype
  745. {      
  746.   cvsprint
  747. } bind def
  748.  
  749. /dicttype        % dicttype
  750. {      
  751.    dup _fmb_d exch known
  752.    {
  753.      _fmb_d exch get
  754.    }
  755.   {
  756.     pop (-dictionary- )
  757.   } ifelse
  758.   tprint
  759. } bind def
  760.  
  761. /filetype        % filetype
  762. {      
  763. dup _fmb_d exch known
  764.   {
  765.     _fmb_d exch get
  766.   }
  767.   {
  768.     pop (-filestream- )
  769.   } ifelse
  770.     tprint
  771. } bind def
  772.  
  773. /nametype        % nametype
  774. {      
  775.   dup xcheck not  
  776.   {    
  777.     (/) tprint
  778.   } if 
  779.   cvsprint
  780. } bind def
  781.  
  782. /booleantype     % booleantype
  783. {      
  784.   cvsprint
  785. } bind def
  786.  
  787. /realtype        % realtype
  788. {      
  789.   cvsprint
  790. } bind def
  791.  
  792. end % _fmb_==dict
  793.  
  794. /_fmb_err_printout
  795. {
  796.   userdict /#copies 1 put
  797.   systemdict /showpage get exec      % display any marks already on the page 
  798.                                                                        % then print error status page(s)
  799.   _fmb_==dict begin
  800.   courier  setfont
  801.   /nl /nl_printout load def
  802.   /tprint /tprint_printout load def
  803.   /= /=_printout load def
  804.   /=print /=print_printout load def
  805.   pageboundries
  806.   /rmargin urx llx sub 10 div def
  807.   end % _fmb_==dict
  808.   {
  809.     _fmb_err_out
  810.   } stopped pop
  811.   systemdict /showpage get exec
  812. } def
  813.  
  814. /_fmb_err
  815. {
  816.   _fmb_==dict begin
  817.   /nl /nl_rchan load def
  818.   /tprint /tprint_rchan load def
  819.   /= /=_rchan load def
  820.   /=print /=print_rchan load def
  821.   /rmargin 60 def
  822.   end % _fmb_==dict
  823.   _fmb_==dict /outfs serverdict /stdout get put
  824.   {
  825.     _fmb_err_out
  826.   } stopped pop
  827.     % send error information to reverse channel in all cases
  828.   serverdict /altname known
  829.   {    % try to send info to alternate channel also
  830.    serverdict /altname get null ne
  831.    serverdict /altout get type /filetype eq and
  832.    {
  833.     _fmb_==dict /outfs serverdict /altout get put
  834.       {
  835.         _fmb_err_out
  836.       } stopped pop
  837.     _fmb_==dict /outfs serverdict /stdout get put
  838.     } if
  839.   } if
  840. } def
  841.  
  842. /_fmb_err_out
  843. {
  844. $error begin
  845. _fmb_==dict begin
  846. _fmb_banner
  847.  
  848.  ostack null eq
  849.  estack null eq or
  850.  dstack null eq or
  851.  {
  852.   (No errors to report at this time.) = nl flush
  853.   end % _fmb_==dict
  854.   end % $error
  855.   stop
  856.  } if
  857.  
  858. _fmb_d begin
  859. serverdict /altin known
  860. {
  861.   serverdict /altin get
  862.   dup type /filetype eq
  863.   {
  864.     (-altin_filestream- ) def
  865.   }
  866.   {
  867.     pop
  868.   } ifelse
  869. } if
  870.  
  871. serverdict /altout known
  872. {
  873.   serverdict /altout get 
  874.   dup type /filetype eq
  875.   {
  876.     (-altout_filestream- ) def
  877.   }
  878.   {
  879.     pop
  880.   } ifelse
  881. } if
  882.  
  883. serverdict /stdin known
  884. {
  885.   serverdict /stdin get
  886.   dup type /filetype eq
  887.   {
  888.     (-stdin_filestream- ) def
  889.   }
  890.   {
  891.     pop
  892.   } ifelse
  893. } if
  894.  
  895. serverdict /stdout known
  896. {
  897.   serverdict /stdout get 
  898.   dup type /filetype eq
  899.   {
  900.     (-stdout_filestream- ) def
  901.   }
  902.   {
  903.     pop
  904.   } ifelse
  905. } if
  906.  
  907. end  % _fmb_d 
  908.  
  909. (2 lines immediately after error line:) =
  910. _fmb_d /_fmb_jl1 get =
  911. _fmb_d /_fmb_jl2 get =
  912. nl
  913. (offending command: ) =print
  914. /command load my==
  915. (error name: ) =print
  916. /errorname load my==
  917. nl
  918. (dict stack (starts at bottom of dict stack):) =print nl
  919.  
  920. /errorname load /dictstackoverflow eq
  921. {
  922.   ostack ostack length 1 sub get
  923. }
  924. {
  925. dstack 
  926. } ifelse
  927.   /cp 0 store ([) tprint
  928.   {
  929.     typeprint
  930.   } forall
  931.   (]) tprint nl nl
  932.  
  933. (operand stack (starts at bottom of operand stack):) =print nl
  934.  
  935. /len ostack length 1 sub store
  936.  
  937. /errorname load /execstackoverflow eq
  938. /errorname load /dictstackoverflow eq or
  939. {
  940.   /len ostack length 2 sub store 
  941. } if
  942.  
  943. /errorname load /stackoverflow eq
  944. {
  945.   ostack ostack length 1 sub get
  946.   dup length 1 sub
  947.   /len exch store
  948. }
  949. {
  950.   ostack 
  951. } ifelse
  952.   /_fmb_ostack exch store
  953.   /cp 0 store ([) tprint
  954.   0 1 len
  955.   {
  956.     _fmb_ostack exch get
  957.     typeprint
  958.   } for
  959.   (]) tprint nl nl
  960.  
  961. (BOTTOM of execution stack:) =print nl nl
  962.  
  963. _fmb_d begin
  964.  
  965. /printrest _fmb_printallstack def
  966. _fmb_printallstack not
  967. {
  968.   { System Software}
  969.   my==
  970. } if
  971.  
  972. /errorname load /execstackoverflow eq
  973. {
  974.   ostack ostack length 1 sub get
  975. }
  976. {
  977.   estack 
  978. } ifelse
  979. {  % forall
  980.   dup type /filetype eq
  981.   {
  982.      /printrest true def
  983.    } if
  984.    printrest
  985.   {
  986.     my==
  987.   }
  988.   {
  989.      pop
  990.   } ifelse
  991. } forall
  992.  
  993. end % _fmb_d 
  994.  
  995. nl
  996. (TOP of execution stack) =print nl nl flush
  997.  
  998. end  % _fmb_==dict
  999. end % $error
  1000.  
  1001. } def
  1002. (Advanced PostScript Error Handler\n) print flush
  1003. (Copyright (C) 1989 by Systems of Merritt, Inc.\n) print flush
  1004. (Finished Loading\n) print flush
  1005. vmstatus pop
  1006. _fmb_vm sub (VM used: ) print _fmb_=string cvs print flush